import requests
from bs4 import BeautifulSoup
import pandas as pd

'''
** Referer 的作用 **
1. 流量来源分析
服务器可通过Referer了解用户从哪个页面跳转而来，帮助统计流量来源（如搜索引擎、外部链接、广告等），优化推广策略。

2. 防盗链（Hotlink Protection）
服务器可检查Referer是否来自合法域名。例如，若图片请求的Referer非本站，则返回错误或替代内容，防止其他网站直接盗用资源。

3. 安全控制
用于防御CSRF（跨站请求伪造）攻击，验证请求是否来自可信源。但不可完全依赖，因Referer可能被篡改或缺失。

4. 用户行为追踪
分析用户在站内的导航路径，优化网站结构

** User-Agent 的作用 **
1. 识别客户端和操作系统

** 思路 **
所有页面：https://ssr1.scrape.center/page/1 ... 11

用语言模拟在浏览器的访问
准备请求头-->
'''


header = {
    "Referer": 'https://ssr1.scrape.center/',
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}

mv_dataframe = {
    "name": [],
    "categories": [],
    "area": [],
    "score": [],
    "year": [],
    "time": []
}

# 目标内容有10页，循环抓取每一页内容
for page in range(1, 11):
# for page in range(1, 2):
    url = f'https://ssr1.scrape.center/page/{page}'
    try:
        response = requests.get(url, headers=header)
        stats = response.status_code
        # print(f'status codes: {stats}')

        # 此处是指对什么内容进行解析，用什么库来解析代码
        soup = BeautifulSoup(response.text, 'html.parser')
        mv_list = soup.find_all(
            name="div", class_="p-h el-col el-col-24 el-col-xs-9 el-col-sm-13 el-col-md-16")
        for i in range(0, len(mv_list)):

            # 电影名
            # print(f'film name：{mv_list[i].h2.text}')
            mv_dataframe['name'].append(mv_list[i].h2.text)
            #   print(div_list[i].div.text)
            # 这个用法只能输出第一个div标签下的内容，并且不能遍历，所以不在这个循环中输出类型，时间等

            # 电影类型
            categories = mv_list[i].find_all(name='div', class_='categories')
            # print(categories)
            btn_list = categories[0].find_all(type='button')
            # print(btn_list)
            catgs = [btn.span.text for btn in btn_list if btn.span is not None]
            catgs_str = ', '.join(catgs)
            mv_dataframe['categories'].append(catgs_str)

            '''
            btn.span.text：提取 <button> 中的 <span> 文本。
            if btn.span：确保 btn.span 存在，避免 None 导致的异常。
            列表推导式将结果直接存储到 catgs 列表中。
            '''

            # 电影地区、时长
            mvsm_info = mv_list[i].find_all(name='div', class_='m-v-sm info')
            # print(f'\n {mvsm_info}')
            # area = []
            # minutes = []
            span1 = mvsm_info[0].find_all(name='span')
            # area.append(span1[0].string)
            # minutes.append(span1[2].string)
            # print(f'film area：{area} \nfilm minutes：{minutes}')
            mv_dataframe['area'].append(span1[0].string)
            mv_dataframe['time'].append(span1[2].string)
            # # 电影年代
            # time = []
            span2 = mvsm_info[1].find_all(name='span')
            if len(span2) > 0:
                # time.append(span2[0].text)
                mv_dataframe['year'].append(span2[0].text)
            else:
                # time.append('')
                mv_dataframe['year'].append('')
            # print(f'film time：{time}')
    except requests.exceptions.RequestException as e:
        print(f'requests error：{e}')
    try:
        score = soup.find_all(name='p', class_='score m-t-md m-b-n-sm')
    # print(score)
        for i in range(0, len(score)):
            #     print(f'film score：{score[i].string.strip()}')
            mv_dataframe['score'].append(score[i].string.strip())
    except Exception as e:
        print(f'score error：{e}')

# print(mv_dataframe)

df = pd.DataFrame(mv_dataframe)
df.to_excel('movies.xlsx', sheet_name='movies', index_label='index')
